package com.kpmg.datalake.common.dynamicdatasource;

import java.sql.SQLException;
import java.util.Map;
import javax.sql.DataSource;

/**
 * 动态数据源存储是存在数据库还是什么地方
 * 为了分布式环境
 *
 * @author Alex.zhao [alex.zhao@kpmg.com]
 * Created on azhao6 on 2018-06-22 14:43:54
 */
public interface DataSourceStoreService {
    /**
     * 校验数据库是否存在
     *
     * @param dataSourceId 数据库唯一性标识
     * @return 是否存在
     * @throws SQLException 执行的sql问题
     */
    Boolean checkAndRefreshDataSource(String dataSourceId) throws SQLException;

    /**
     * 校验刷新动态数据源
     *
     * @param dataSourceId 数据库唯一性标识
     * @param dataSource   数据源
     * @return 是否校验刷新成功
     * @throws SQLException 刷新时的数据库错误
     */
    Boolean checkAndRefreshDataSource(String dataSourceId, DataSource dataSource) throws SQLException;

  /**
   * 强制刷新内存服务
   *
   * @param dataSourceId dataSourceId
   * @param dataSource dataSource
   * @throws SQLException SQLException
   */
  void refreshTargetDataSource(String dataSourceId, DataSource dataSource)
      throws SQLException;

    /**
     * 共享存储中是否存在该数据源
     *
     * @param dataSourceId 数据源ID
     * @return 是否存在
     */
    Boolean containMemoryDataSource(String dataSourceId);

    /**
     * 新增一个数据源
     *
     * @param dataSourceId 数据源唯一性标识
     * @param dataSource   数据源
     */
    void putMemoryDataSource(String dataSourceId, DataSource dataSource);

    /**
     * 获取所有datasource
     *
     * @return Map<Object,Object>
     */
    Map<Object, Object> getMemoryDataSource();

    /**
     * 通过唯一性标识获取数据库主键
     *
     * @param dataSourceId dataSourceId
     * @return DataSource
     */
    DataSource getMemoryDataSourceById(String dataSourceId);


    /**
     * 获取共享的数据源
     *
     * @param dataSourceId 数据源唯一标识
     * @return DatabaseDTO
     */
    DatabaseDTO getShardDataSource(String dataSourceId);

    /**
     * 共享数据源中增加数据
     *
     * @param dataSourceId 数据源ID
     * @param databaseDTO  数据源
     */
    void setShardDataSource(String dataSourceId, DatabaseDTO databaseDTO);

    /**
     * 共享存储中是否存在该数据源
     *
     * @param dataSourceId 数据源ID
     * @return 是否存在
     */
    Boolean containShardDataSourceId(String dataSourceId);


    /**
     * 通过数据源信息 获取数据库唯一标识
     *
     * @param databaseDTO 数据源信息
     * @return 唯一标识
     */
    String getTokenByDataSource(DatabaseDTO databaseDTO);

}
